package cn.aylog.spareArray;

import java.io.*;
import java.util.Arrays;

/**
 * 数据结构与算法 之
 *  稀疏数组
 */
public class Main {
    public static void main(String[] args) throws Exception {
        Main main = new Main();
        int arr[][] = new int[11][11];
        arr[1][2] = 1;
        arr[2][3] = 2;
        arr[4][2] = 1;
//        System.out.println("原始数组:");
//        main.show(arr);
//        System.out.println("稀疏数组:");
//        int[][] spareArray = main.array2SpareArray(arr);
//        main.show(spareArray);
//        System.out.println("转换后的原始数组:");
//        int[][] arr2 = main.spareArray2Array(spareArray);
//        main.show(arr2);
        // 对象序列化
        main.downObject(arr);
        System.out.println("序列化成功");

        // 对象反序列化
        int[][] o = main.loadObject();
        main.show(o);
        System.out.println("反序列化成功");
    }

    /**
     * 序列化
     */
    private void downObject(Object o) {
        String path = Main.class.getClassLoader().getResource("data").getPath();
        File file = new File(path);
        try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) {
            oos.writeObject(o);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 反序列化
     */
    private <T> T loadObject() {
        T ret = null;
        InputStream is = Main.class.getClassLoader().getResourceAsStream("data");
        try(ObjectInputStream ois = new ObjectInputStream(is)) {
            ret = (T) ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            if(is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return ret;
    }

    /**
     * 稀疏数组转一般数组
     */
    private int[][] spareArray2Array(int spareArray[][]) {
        int row = spareArray[0][0];
        int col = spareArray[0][1];
        int ret[][] = new int[row][col];
        for(int i=1; i<spareArray.length; i++) {
            int cfg[] = spareArray[i];
            ret[cfg[0]][cfg[1]] = cfg[2];
        }
        return ret;
    }

    /**
     * 一般数组转稀疏数组
     */
    private int[][] array2SpareArray(int array[][]) {
        int cnt = 0;
        int row = array.length;
        int col = array[0].length;
        // 遍历获取有多少个值
        for(int i=0; i< row; i++) {
            for(int j=0; j< col; j++) {
                int val = array[i][j];
                if(val != 0) {
                    cnt++;
                }
            }
        }
        int ret[][] = new int[cnt + 1][3];
        ret[0][0] = row;
        ret[0][1] = col;
        ret[0][2] = cnt;
        int count = 0;
        // 再次遍历存值
        for(int i=0; i< row; i++) {
            for(int j=0; j< col; j++) {
                int val = array[i][j];
                if(val != 0) {
                    count++;
                    ret[count][0] = i;
                    ret[count][1] = j;
                    ret[count][2] = val;
                }
            }
        }
        return ret;
    }

    private void show(int array[][]) {
        for(int[] row : array) {
            for(int v : row) {
                System.out.printf("%d\t", v);
            }
            System.out.println();
        }
    }
}
